#在用 for..in.. 迭代对象时，
# 如果对象没有实现 __iter__ __next__ 迭代器协议，
# Python的解释器就会去寻找__getitem__ 来迭代对象，
# 如果连__getitem__ 都没有定义，这解释器就会报对象不是迭代器的错误：
class Zoo(object):

    def __init__(self,animals):
        self.animals=animals
        self.key={"testA":"testa"}
        self.__dict__.update(self.key)

    def __getitem__(self, index):
        return self.animals[index]

    def __contains__(self, item):
        print(item)
        return item in self.key

zoo=Zoo(["1","2","3"])

print(zoo.testA)

# for x in zoo:
#     print(x)

# iter 返回的需要迭代的对象
# next 是真正需要返回的东西
# 配合raise StopIteration
# 1. 不能向后移动回到开始
# 2. 不能复制一个迭代器
# 3. 若要再次（或同时）迭代同个对象，只能去创建另一个迭代器对象
# 4. 迭代时请尽量不要修改该对象，否则可能会出错
class ZooIter:

    def __init__(self,animals):
        self.animals=animals
        self.index = 0

    def __iter__(self):
        """
            返回迭代对象
        :return:
        """
        return self

    def  __next__(self):
        current_index = self.index
        self.index = current_index+1
        if current_index<len(self.animals):
            return self.animals[current_index]
        else:
            raise StopIteration();

zoo=ZooIter(["a","b","c"])

for x in zoo:
    print(x)


# 对比生成器
# 迭代器是一个对象，生成器是一个函数。
# 实践中最好用这个
